{
  "openapi": "3.1.0",
  "info": {
    "title": "Cloud Storage Open API",
    "description": "Керування файлами, вивантаженнями, видаленнями та мітками файлів хмарного сховища MoreLogin через MoreLogin Open API.\n\n**Базовий URL**: `https://api.morelogin.com`\n\nАвтентифікація виконується bearer-токеном OAuth2. Докладніше див. [Автентифікація](../Getting%20Started/authentication.md).\n",
    "version": "2026-09-05"
  },
  "servers": [
    {
      "url": "https://api.morelogin.com"
    }
  ],
  "tags": [
    {
      "name": "Cloud Storage",
      "description": "Запит квоти та використання сховища"
    },
    {
      "name": "Cloud Storage Files",
      "description": "Запит, завантаження та видалення файлів хмарного сховища"
    },
    {
      "name": "Cloud Storage File Tags",
      "description": "Керування тегами файлів хмарного сховища"
    }
  ],
  "x-tagGroups": [
    {
      "name": "Cloud Storage",
      "tags": [
        "Cloud Storage",
        "Cloud Storage Files",
        "Cloud Storage File Tags"
      ]
    }
  ],
  "paths": {
    "/cloudstorage/info": {
      "get": {
        "summary": "Запит інформації про хмарне сховище",
        "description": "Повертає квоту хмарного сховища команди та поточне використання.\n- **Передумови**: команда вже має мати запис хмарного сховища. **Команда, якій хмарне сховище ніколи не виділялося, отримає помилку, а не нульову ємність** — запис створюється під час покупки сховища, а не відкладено цим викликом.\n- **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою витримкою.\n- **Одиниці**: `capacity` і `usedCapacity` — кількість байтів.\n- **Точність**: `usedCapacity` — накопичувальний лічильник, що оновлюється під час вивантаження та видалення, а не сума, яка обчислюється за таблицею файлів у момент запиту, тому він може розходитися із сумою `fileSize` у `/cloudstorage/file/page`.\n- **Значення**: `capacityStatus` дорівнює `1` лише коли позитивна квота вичерпана повністю; `isExpired` порівнює дату спливання з поточним моментом. Файли, вивантаження яких не було підтверджено, у `usedCapacity` не враховуються.\n\nЗадокументовані бізнес-помилки: `39001`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "queryCloudStorageInfo",
        "tags": [
          "Cloud Storage"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/StorageInfoResponse"
          }
        }
      }
    },
    "/cloudstorage/file/page": {
      "post": {
        "summary": "Посторінковий список файлів хмарного сховища",
        "description": "Посторінково виводить файли Cloud Storage.\n- **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою витримкою.\n- **Видимість**: **виводяться лише файли, вивантаження яких підтверджено**: файл із передпідписаним URL, вивантаження якого так і не було завершено, не з'явиться. Учасники без права на всі дані бачать лише вивантажені ними файли.\n- **Фільтрація**: `fileName` зіставляється частково; `tagIds` працює за логікою АБО; результати впорядковані від нових до старих, і цей порядок змінити неможливо.\n- **Особливість**: елемент `tagInfo` може дорівнювати null, якщо мітку було видалено, доки вона ще була прив'язана до файлу.",
        "operationId": "pageCloudStorageFiles",
        "tags": [
          "Cloud Storage Files"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FilePageRequest"
              },
              "example": {
                "pageNo": 1,
                "pageSize": 20,
                "fileName": "report",
                "tagIds": [
                  "1800000000000001"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/FilePageResponse"
          }
        }
      }
    },
    "/cloudstorage/upload/init": {
      "post": {
        "summary": "Пакетний запит попередньо підписаних URL для завантаження",
        "description": "Резервує записи у хмарному сховищі та видає передпідписані URL для вивантаження.\n- **Передумови**: команда має мати запис хмарного сховища, і він не має бути протермінованим. Базове імʼя кожного файлу обмежене 60 символами й має бути унікальним як у межах запиту, так і щодо всіх наявних файлів команди — **звірка йде за імʼям без розширення**, тому `a.png` конфліктує з наявним `a.mp4`.\n- **Обмеження**: одночасно в команді може бути не більше 100 непідтверджених вивантажень.\n- **Ефект**: вставляє по одному запису на імʼя зі статусом «вивантажується» та нульовим розміром і повертає `{id, fileName, presignedUrl}` для кожного.\n- **Квота**: **вільне місце тут не перевіряється.** Воно списується під час підтвердження вивантаження, тому init може пройти, а complete все одно впасти через нестачу місця.\n- **Завершення**: синхронне. **Кожен передпідписаний URL дійсний одну годину**; надішліть байти методом `PUT`, а потім викличте `/cloudstorage/upload/complete`.\n\nЗадокументовані бізнес-помилки: `39001`, `39037`, `39044`, `39045`, `39047`, `39050`, `39051`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "batchRequestCloudStoragePresignedUploadUrls",
        "tags": [
          "Cloud Storage Files"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadInitRequest"
              },
              "example": {
                "fileNames": [
                  "example.jpg",
                  "docs/report.pdf"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/UploadInitResponse"
          }
        }
      }
    },
    "/cloudstorage/upload/complete": {
      "post": {
        "summary": "Підтвердження завершення завантаження",
        "description": "Підтверджує вивантажений файл хмарного сховища.\n- **Передумови**: запис файлу має належати вашій команді, а обʼєкт уже має бути у сховищі — служба читає його ETag і довжину для перевірки. Розмір має бути більшим за 0 і меншим за 2 ГБ.\n- **Ефект**: атомарно списує квоту сховища команди, потім позначає запис вивантаженим і зберігає реальний розмір. Поки це не вдалося, файл **не зʼявляється у `/cloudstorage/file/page`** і продовжує займати один зі 100 непідтверджених слотів.\n- **У разі помилки вивантажений обʼєкт видаляється.** Надто ранній виклик, перевищення межі розміру або нестача місця видаляють байти зі сховища й залишають запис непідтвердженим. Відновлення — це новий `/cloudstorage/upload/init` і повторне вивантаження, а не повтор цього виклику.\n- **Завершення**: синхронне й ідемпотентне після успіху — другий виклик поверне той самий файл, не списуючи квоту повторно.\n- **Примітка**: запис, який так і не підтвердили, автоматично прибирається через 24 години.\n\nЗадокументовані бізнес-помилки: `39001`, `39011`, `39014`, `39041`, `39046`, `39047`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "confirmCloudStorageUploadComplete",
        "tags": [
          "Cloud Storage Files"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UploadCompleteRequest"
              },
              "example": {
                "id": "1800000000000001"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/UploadCompleteResponse"
          }
        }
      }
    },
    "/cloudstorage/file/delete/batch": {
      "post": {
        "summary": "Пакетне видалення файлів хмарного сховища",
        "description": "Видаляє файли Cloud Storage за ідентифікаторами.\n- **Передумови**: усі ідентифікатори мають розв'язуватися в межах вашої команди; **якщо хоча б один не розв'язується, весь пакет відхиляється й відкочується**, включно з ідентифікаторами, які вже було видалено.\n- **Ефект**: це логічне видалення. Квота звільняється в тій самій транзакції, а збережені об'єкти видаляються за можливості: збій сховища записується в лог, але не призводить до помилки виклику, тому об'єкт може пережити свій запис. Прив'язки міток не очищаються.\n- **Завершення**: синхронне. Звільнене місце підтвердьте через `/cloudstorage/info`.\n\nЗадокументовані бізнес-помилки: `39011`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "batchDeleteCloudStorageFiles",
        "tags": [
          "Cloud Storage Files"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FileDeleteRequest"
              },
              "example": {
                "ids": [
                  "1800000000001001",
                  "1800000000001002"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/cloudstorage/file/tag/set": {
      "post": {
        "summary": "Задати мітки файлу",
        "description": "Замінює мітки у файлу Cloud Storage.\n- **Передумови**: один `fileId` на виклик, а `tagIds` не має бути порожнім і має посилатися на мітки Cloud Storage, що належать вашій команді. Мітки профілів відхиляються.\n- **Ефект**: мітки, відсутні в запиті, знімаються з файлу, а ті, яких бракує, додаються. **Зняти тут усі мітки неможливо**, бо порожній список відхиляється.\n- **Завершення**: синхронне й ідемпотентне за однакового тіла запиту.\n\nЗадокументовані бізнес-помилки: `39011`, `39048`, `39049`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "setCloudStorageFileTags",
        "tags": [
          "Cloud Storage File Tags"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FileTagChangeRequest"
              },
              "example": {
                "fileId": "1800000000001001",
                "tagIds": [
                  "1800000000000101",
                  "1800000000000102"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/cloudstorage/file/tag/add": {
      "post": {
        "summary": "Додати мітки файлу",
        "description": "Додає мітки до файлу Cloud Storage, не знімаючи наявних.\n- **Передумови**: один `fileId` на виклик, а `tagIds` не має бути порожнім і має посилатися на мітки Cloud Storage, що належать вашій команді.\n- **Ефект**: лише додає; наявні мітки залишаються на місці. Для заміни використовуйте варіант із повним встановленням.\n- **Завершення**: синхронне й ідемпотентне — додавання мітки, яку файл уже має, нічого не змінює.\n\nЗадокументовані бізнес-помилки: `39011`, `39048`, `39049`. Значення кодів див. у [Error Codes](../Getting%20Started/error-codes.md). Будь-яка операція може додатково повернути загальні коди.",
        "operationId": "addCloudStorageFileTags",
        "tags": [
          "Cloud Storage File Tags"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FileTagChangeRequest"
              },
              "example": {
                "fileId": "1800000000001001",
                "tagIds": [
                  "1800000000000103"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/VoidDataResponse"
          }
        }
      }
    },
    "/cloudstorage/file/tag/query": {
      "post": {
        "summary": "Запитати мітки файлу",
        "description": "Повертає мітки, прив'язані до одного або кількох файлів Cloud Storage.\n- **Передумови**: усі `fileId` мають розв'язуватися в межах вашої команди; **один невідомий ідентифікатор призводить до помилки всього виклику**, а не до часткових даних.\n- **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою витримкою.\n- **Особливість**: `tagIds` читається з прив'язок, а подробиці міток беруться з наявних міток, тому мітка, видалена за збереженої прив'язки, потрапить до `tagIds` без відповідного запису в подробицях. Довжини двох списків можуть різнитися.",
        "operationId": "queryCloudStorageFileTags",
        "tags": [
          "Cloud Storage File Tags"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FileTagQueryRequest"
              },
              "example": {
                "fileIds": [
                  "1800000000001001"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/FileTagsResponse"
          }
        }
      }
    },
    "/cloudstorage/tag/all": {
      "get": {
        "summary": "Запитати всі мітки файлів Cloud Storage",
        "description": "Повертає всі мітки файлів Cloud Storage в команді.\n- **Ефект**: відсутній. Лише читання. Повтор безпечний з обмеженою витримкою.\n- **Примітка**: пагінації немає, і в міток Cloud Storage немає серверного обмеження за кількістю, тому відповідь зростає разом із числом міток, які створює ваша команда.",
        "operationId": "queryAllCloudStorageFileTags",
        "tags": [
          "Cloud Storage File Tags"
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/TagListResponse"
          }
        }
      }
    },
    "/cloudstorage/tag/create": {
      "post": {
        "summary": "Створити мітку файлу Cloud Storage",
        "description": "Створює мітку файлу Cloud Storage.\n- **Передумови**: `tagName` не має бути порожнім.\n- **Ефект**: створює мітку з кольором, вибраним із фіксованої палітри. **Перевірки на дублювання назви немає, обмеження за кількістю теж немає**, тому повторний виклик створить другу мітку з тією самою назвою.\n- **Завершення**: синхронне; відповідь містить нову мітку.",
        "operationId": "createCloudStorageFileTag",
        "tags": [
          "Cloud Storage File Tags"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagCreateRequest"
              },
              "example": {
                "tagName": "Invoice"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/TagResponse"
          }
        }
      }
    },
    "/cloudstorage/tag/edit": {
      "post": {
        "summary": "Змінити мітку файлу Cloud Storage",
        "description": "Перейменовує мітку файлу Cloud Storage.\n- **Передумови**: мітка має існувати у вашій команді й бути міткою Cloud Storage.\n- **Ефект**: змінюється лише назва; колір і всі наявні прив'язки зберігаються, тому файли одразу показують нову назву.\n- **Завершення**: синхронне. Оптимістичного блокування немає — за одночасних перейменувань перемагає останній запис.",
        "operationId": "editCloudStorageFileTag",
        "tags": [
          "Cloud Storage File Tags"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagEditRequest"
              },
              "example": {
                "id": "1800000000000101",
                "tagName": "Invoice 2026"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    },
    "/cloudstorage/tag/delete/batch": {
      "post": {
        "summary": "Видалити мітки файлів Cloud Storage",
        "description": "Видаляє мітки файлів Cloud Storage.\n- **Передумови**: усі ідентифікатори мають бути мітками Cloud Storage вашої команди; **один недопустимий ідентифікатор призводить до помилки всього пакета**.\n- **Ефект**: мітки видаляються, але **їхні прив'язки до файлів не очищаються**. Очікуйте два наслідки: `/cloudstorage/file/tag/query` і далі повертатиме ідентифікатор видаленої мітки без відповідних подробиць, а `tagInfo` у `/cloudstorage/file/page` може містити елементи null. Фільтрація файлів за ідентифікатором видаленої мітки нічого не поверне.\n- **Завершення**: синхронне й не обгорнуте в транзакцію.",
        "operationId": "deleteCloudStorageFileTags",
        "tags": [
          "Cloud Storage File Tags"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TagDeleteRequest"
              },
              "example": {
                "ids": [
                  "1800000000000101",
                  "1800000000000102"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/BooleanDataResponse"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "Authorization": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "ApiResponseBase": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "description": "Код результату. `0` означає успіх; інші коди вказують на помилку.",
            "example": 0
          },
          "msg": {
            "type": [
              "string",
              "null"
            ],
            "description": "Повідомлення про помилку.",
            "example": null
          },
          "requestId": {
            "type": "string",
            "description": "ID запиту операції. Це поле може бути присутнім, якщо запит пройшов через API-шлюз.",
            "example": "1d4f3ea968664593860b94b35d4ebf5e"
          }
        },
        "required": [
          "code",
          "msg"
        ]
      },
      "StorageInfo": {
        "type": "object",
        "properties": {
          "capacity": {
            "type": "string",
            "description": "Загальна ємність хмарного сховища в байтах.",
            "example": "10737418240"
          },
          "usedCapacity": {
            "type": "string",
            "description": "Використана ємність хмарного сховища в байтах.",
            "example": "536870912"
          },
          "expireDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Дата спливання хмарного сховища."
          },
          "capacityStatus": {
            "type": "integer",
            "description": "Статус ємності: 0 = норма, 1 = заповнено.",
            "example": 0
          },
          "isExpired": {
            "type": "boolean",
            "description": "Чи сплив тарифний план підписки.",
            "example": false
          }
        }
      },
      "CloudStorageFile": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Ідентифікатор файла у хмарному сховищі.",
            "example": "1800000000001001"
          },
          "fileName": {
            "type": "string",
            "description": "Ім'я файлу (без розширення).",
            "example": "example"
          },
          "fileExt": {
            "type": "string",
            "description": "Розширення файлу.",
            "example": "jpg"
          },
          "fileSize": {
            "type": "string",
            "description": "Розмір файлу в байтах.",
            "example": "204800"
          },
          "fileType": {
            "type": "integer",
            "description": "Тип файлу: 0 = зображення, 1 = відео, 2 = застосунок, 3 = аудіо, 4 = документ, 5 = інше.",
            "example": 0
          },
          "tagInfo": {
            "type": "array",
            "description": "Подробиці міток, прив'язаних до файлу.",
            "items": {
              "$ref": "#/components/schemas/TagInfo"
            }
          },
          "createDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Дата вивантаження."
          },
          "updateDate": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$",
            "description": "Дата оновлення."
          }
        }
      },
      "TagInfo": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Ідентифікатор тегу.",
            "example": "1800000000000101"
          },
          "tagSource": {
            "type": "string",
            "description": "Джерело мітки, наприклад ENV, PROXY.",
            "example": "ENV"
          },
          "tagName": {
            "type": "string",
            "description": "Назва тегу.",
            "example": "Invoice"
          },
          "tagType": {
            "type": "string",
            "description": "Тип мітки: TAG або GROUP.",
            "example": "TAG"
          },
          "tagIcon": {
            "type": "string",
            "description": "Іконка мітки.",
            "example": ""
          }
        }
      },
      "FilePageRequest": {
        "type": "object",
        "properties": {
          "pageNo": {
            "type": "integer",
            "description": "Номер поточної сторінки, починаючи з 1. За замовчуванням 1.",
            "minimum": 1,
            "default": 1,
            "example": 1
          },
          "pageSize": {
            "type": "integer",
            "description": "Кількість елементів на сторінці. За замовчуванням 10.",
            "minimum": 1,
            "default": 10,
            "example": 20
          },
          "fileName": {
            "type": "string",
            "description": "Ключове слово імені файлу для нечіткого пошуку.",
            "example": "report"
          },
          "tagIds": {
            "type": "array",
            "description": "Фільтрує файли за ID міток.",
            "items": {
              "type": "string"
            },
            "example": [
              "1800000000000101"
            ]
          },
          "fileType": {
            "type": "integer",
            "description": "Фільтр за типом файлу: 0 = зображення, 1 = відео, 2 = застосунок, 3 = аудіо, 4 = документ, 5 = інше.",
            "example": 0
          },
          "fileIds": {
            "type": "array",
            "description": "Фільтрує файли за ID файлів.",
            "items": {
              "type": "string"
            },
            "example": [
              "1800000000001001"
            ]
          }
        }
      },
      "FilePageData": {
        "type": "object",
        "properties": {
          "current": {
            "type": "string",
            "example": "1"
          },
          "pages": {
            "type": "string",
            "example": "7"
          },
          "total": {
            "type": "string",
            "example": "128"
          },
          "dataList": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CloudStorageFile"
            }
          }
        },
        "required": [
          "current",
          "pages",
          "total",
          "dataList"
        ]
      },
      "UploadInitRequest": {
        "type": "object",
        "properties": {
          "fileNames": {
            "type": "array",
            "minItems": 1,
            "description": "Список імен файлів для вивантаження (з розширенням), наприклад photo.jpg, video.mp4.",
            "items": {
              "type": "string"
            },
            "example": [
              "photo.jpg",
              "video.mp4"
            ]
          }
        },
        "required": [
          "fileNames"
        ]
      },
      "UploadInitResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Ідентифікатор файла у хмарному сховищі.",
            "example": "1800000000000001"
          },
          "fileName": {
            "type": "string",
            "description": "Ім'я файлу (з розширенням).",
            "example": "photo.jpg"
          },
          "presignedUrl": {
            "type": "string",
            "description": "Передпідписаний URL S3 для вивантаження. Використовуйте HTTPS PUT, щоб вивантажити вміст файлу.",
            "example": "https://example.com/presigned-upload-url"
          }
        }
      },
      "UploadCompleteRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "ID файлу Cloud Storage, повернений API передпідписаного URL для вивантаження.",
            "example": "1800000000000001"
          }
        },
        "required": [
          "id"
        ]
      },
      "FileDeleteRequest": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "description": "ID файлів Cloud Storage для видалення.",
            "example": [
              "1800000000001001",
              "1800000000001002"
            ]
          }
        },
        "required": [
          "ids"
        ]
      },
      "FileTagChangeRequest": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string",
            "description": "Ідентифікатор файла у хмарному сховищі.",
            "example": "1800000000001001"
          },
          "tagIds": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "description": "Ідентифікатори тегів.",
            "example": [
              "1800000000000101",
              "1800000000000102"
            ]
          }
        },
        "required": [
          "fileId",
          "tagIds"
        ]
      },
      "FileTagQueryRequest": {
        "type": "object",
        "properties": {
          "fileIds": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "description": "ID файлів Cloud Storage.",
            "example": [
              "1800000000001001"
            ]
          }
        },
        "required": [
          "fileIds"
        ]
      },
      "FileTagResultData": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string",
            "description": "Ідентифікатор файла у хмарному сховищі.",
            "example": "1800000000001001"
          },
          "tagIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "ID міток, прив'язаних до файлу.",
            "example": [
              "1800000000000101"
            ]
          },
          "tagInfo": {
            "type": "array",
            "description": "Подробиці міток.",
            "items": {
              "$ref": "#/components/schemas/TagInfo"
            }
          }
        }
      },
      "TagCreateRequest": {
        "type": "object",
        "properties": {
          "tagName": {
            "type": "string",
            "description": "Назва тегу.",
            "example": "Invoice"
          }
        },
        "required": [
          "tagName"
        ]
      },
      "TagEditRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Ідентифікатор тегу.",
            "example": "1800000000000101"
          },
          "tagName": {
            "type": "string",
            "description": "Назва тегу.",
            "example": "Invoice 2026"
          }
        },
        "required": [
          "id",
          "tagName"
        ]
      },
      "TagDeleteRequest": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string"
            },
            "description": "ID міток для видалення.",
            "example": [
              "1800000000000101"
            ]
          }
        },
        "required": [
          "ids"
        ]
      }
    },
    "responses": {
      "StorageInfoResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/StorageInfo"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "FilePageResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FilePageData"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "UploadInitResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/UploadInitResult"
                      }
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "UploadCompleteResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/CloudStorageFile"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "VoidDataResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "null",
                      "example": null
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "BooleanDataResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "boolean",
                      "example": true
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "FileTagsResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FileTagResultData"
                      }
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "TagListResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TagInfo"
                      }
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      },
      "TagResponse": {
        "description": "Успіх",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/ApiResponseBase"
                },
                {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TagInfo"
                    }
                  },
                  "required": [
                    "data"
                  ]
                }
              ]
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "Authorization": []
    }
  ]
}